/**
 * 
 * 1. 可以直接读取指定的文件 
 * 1 然后进行一些操作，比如merge,
 * 2 替换之类的，
 * 3 纠正一致的列顺序
 * 4 如果没有翻译则读取英文的翻译
 * 
 * key 必须要在第一列
 */


const fs = require('fs');
const fsPromises = require('fs').promises;
const { LANG_CODE_REG, LINE_BREAK_REG } = require('./consts');
// const Buffer = require('buffer');
/**
 * Args
 * -m 合并文件数据 如果有替换需要提出警告
 * 
 */

const OUTPUT_PATH = 'output';
const SOURCE_PATH = 'source';

function checkLangRow(str) {
  const cols = str.split('\t');
  return cols[0].toLocaleLowerCase().indexOf('key') > -1
    && cols.find((title) => title.indexOf('zh_CN') > -1)
    && cols.find((title) => title.indexOf('en_US') > -1);
}
/**
 * source :string
 */

const getSourceData = (source) => {
  const rows = source.split(LINE_BREAK_REG);  // 兼容windows系统
  let languages = [];
  const sourceData = [];
  rows.forEach((rowStr) => {
    if (languages.length === 0) {
      if (checkLangRow(rowStr)) {
        languages = rowStr.split('\t').slice(1).map((val, index) => {
          const lang = val.match(LANG_CODE_REG)[0];
          sourceData.push({
            lang,
            index: index + 1,
            trans: [],
          });
        });
      }
    } else {
      const cols = rowStr.split('\t');
      const { index: enIndex } = sourceData.find((item) => item.lang === 'en_US');
      sourceData.forEach((item) => {
        if (cols[0]) {
          if (cols[item.index]) {
            item.trans.push([cols[0], cols[item.index]]);
          } else {
            item.trans.push([cols[0], cols[enIndex] || ""]);
          }
        }
      });
    }
  });
  return sourceData;
};

const mergeData = (d1, d2) => {
  // _d2_index_map = {};
  d1.forEach((langData) => {
    const { lang, trans } = langData;
    const d2Data = d2.find(item => item.lang === lang);
    // 如果d2中也有对应语言的数据，那么遍历d2合并数据
    if (d2Data) {
      d2Data.trans.forEach((d2cou) => {
        const d1cou = trans.find((t) => t[0] === d2cou[0]);
        if (d1cou) {
          // 覆写值
          if (d2cou[1]) {
            d1cou[1] = d2cou[1];
            console.warn(`${lang} ${d2cou[0]} will be overwritten`);
          }
        } else {
          trans.push(d2cou);
        }
      });
    }
  });
  return d1;
};

const stringifyTrans = (trans) => {
  let result = '{\n';
  trans.forEach(([key, value]) => {
    result += `  "${key}":  ${JSON.stringify(value)},\n`;
  });
  result = result.slice(0, -2);
  result += '\n}';
  return result;
};
const getRightPath = (filename) => {
  return `${SOURCE_PATH}/${filename}`;
};

async function tsv2json(commandArgs) {
  // const writestr = await fs.readFile(writepath, { encoding: 'utf8' });
  let resultData;
  // merge参数 -m
  if (commandArgs[0] === '-m') {
    // 合并文件
    resultData = commandArgs.slice(1).map((filename) => {
      const str = fs.readFileSync(getRightPath(filename), {encoding: 'utf8'});
      return getSourceData(str);
    }).reduce((a, b) => mergeData(a, b));
  } else {
    const str = fs.readFileSync(getRightPath(commandArgs[0]), {encoding: 'utf8'});
    resultData = getSourceData(str);
  }
  
  // 输出结果
  // 如果 ./out 目录不存在 则创建目录

  if (!fs.existsSync(OUTPUT_PATH)) {
    await fsPromises.mkdir(OUTPUT_PATH);
  }
  resultData.forEach(item => {
    const resultStr = stringifyTrans(item.trans);
    fs.writeFile(`${OUTPUT_PATH}/${item.lang}.json`, resultStr, (err) => {
      if (err) {
        console.error(`${item.lang}.json wirte failed.`);
      }
    });
  });
  console.info('The task has finished!');
}

// export default tsv2json;
exports.default = tsv2json;
exports.getDataFromTsv = getSourceData;
// export const getDataFromTsv = getSourceData